<!DOCTYPE html>
<title>Name look-up tests of Window interface</title>
<!-- TODO(yukishiino): Change the name look-up behavior of Window and fix all these tests. -->
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<div id="container"></div>
<script>
var global = this;
var container = document.getElementById('container');

test(function() {
    var originalAlert = window.alert;
    var iframe = document.createElement('iframe');
    iframe.name = 'alert';
    container.appendChild(iframe);
    assert_equals(window.alert, originalAlert, "window.alert shouldn't be shadowed by named properties.");
}, "Named access test.  Window's members should have priority over named properties.");

test(function() {
    // Window's prototype chain must be
    // window --> Window.prototype --> "WindowProperties" --> EventTarget.prototype
    assert_equals(window.__proto__, Window.prototype);
    assert_class_string(window.__proto__.__proto__, 'WindowProperties');
    assert_equals(window.__proto__.__proto__.__proto__, EventTarget.prototype);
}, "WindowProperties object should exist.");

test(function() {
    var anchor = document.createElement('a');
    anchor.id = 'myAnchor';
    container.appendChild(anchor);
    assert_equals(window.myAnchor, anchor, "Named access should work when WindowProperties is available.");
    // Look up the prototype chain and observe that the anchor is defined on the
    // named properties object, no lower or higher.
    assert_equals(window.__proto__.myAnchor, anchor, "Named access should work on Window.prototype");
    assert_equals(window.__proto__.__proto__.myAnchor, anchor, "Named access should work on named properties object");
    assert_equals(window.__proto__.__proto__.__proto__.myAnchor, undefined, "Named access does not work on EventTarget.prototype");
    assert_equals(window.__proto__.__proto__.__proto__.__proto__.myAnchor, undefined, "Named access does not work on Object.prototype");
}, "WindowProperties object should provide named access.");

test(function() {
    assert_true(window.hasOwnProperty('onclick'), "Window's event handlers should be own properties.");
    assert_true(window.hasOwnProperty('alert'), "Window's methods should be own properties.");
}, "Window's members should be own members.");

// This test needs to run in the global scope.
assert_false(!!window.onclick, "window.onclick is not yet set.");
var wasMyOnClickCalled = false;
var myOnClick = function() { wasMyOnClickCalled = true; };
var onclick = myOnClick;
assert_equals(window.onclick, myOnClick, "var declaration should be ignored, and window.onclick should be updated.");
window.dispatchEvent(new Event('click'));
assert_true(wasMyOnClickCalled, "myOnClick should have been called.");
</script>
</html>
